package com.zxl.designpattern.creator.builder;

import static com.zxl.designpattern.creator.builder.Computer.*;

/**
 * @author zxl
 * @version 1.0
 * @description 建造者测试类
 * @date 2025/6/1 10:12
 */
public class Test {

    public static void main(String[] args) {
        // 测试结构完全的建造者模式
        testCompleteFormBuilder();
        // 测试简单构造器
        testSimpleBuilder();
    }

    /**
     * 测试结构完全的建造者模式
     */
    public static void testCompleteFormBuilder() {
        // 创建指挥者
        Director director = new Director();
        // 创建建造者
        SedanCarBuilder sedanCarBuilder = new SedanCarBuilder();
        TruckBuilder truckBuilder = new TruckBuilder();
        // 指挥者指挥建造者构建产品
        director.constructSedanCar(sedanCarBuilder);
        director.constructTruck(truckBuilder);
        // 建造者输出产品
        Product sedanCar = sedanCarBuilder.getResult(); // 轿车
        Product truck = truckBuilder.getResult(); // 卡车

        // 打印产品信息
        System.out.println(sedanCar);  // 输出：Product{engine='V6 发动机', wheels='4 个轮子', body='轿车车身'}
        System.out.println(truck);     // 输出：Product{engine='V8 柴油发动机', wheels='6 个轮子', body='卡车车身'}
    }

    /**
     * 测试简单模式的建造者
     */
    public static void testSimpleBuilder() {
        ComputerBuilder builder = ComputerBuilder.getInstance("I5-13600K");
        // 链式调用
        Computer computer = builder.setRam("32G").setStorage("4T")
                .setGraphicsCard("RTX 5070TI").setMonitor("HTC").build();
        System.out.println(computer.toString());
        
        // StringBuilder也使用了建造者模式
        // HttpRequest也是建造者模式，通过一个个部分的组成（链式调用实现），最终创建一个对象
//        HttpRequest request = HttpRequest.newBuilder()
//                .uri(URI.create("https://example.com/api"))
//                .header("Content-Type", "application/json")
//                .POST(HttpRequest.BodyPublishers.ofString(""))
//                .build();
    }
}
